home *** CD-ROM | disk | FTP | other *** search
/ Nebula 1 / Nebula One.iso / Graphics / Viewers / aa_m68k_Intel_Only / ToyViewer1.2 / Source / ADController.m < prev    next >
Encoding:
Text File  |  1995-11-12  |  3.1 KB  |  171 lines

  1. #import "ADController.h"
  2. #import "ADSlave.h"
  3. #import "TVController.h"
  4. #import "PrefControl.h"
  5.  
  6. #define  Stat_INIT    0
  7. #define  Stat_PLAY    1
  8. #define  Stat_PAUSE    2
  9. #define  Stat_QUIT    3
  10.  
  11. static id activePanel = nil;
  12.  
  13.  
  14. @implementation ADController
  15.  
  16. #define  Panel_X(n)    (6.0 + ((n) % 4) * 16.0 + ((n) / 8) * 9.0)
  17. #define  Panel_Y(n)    (400.0 - ((n) % 8) * 20.0)
  18.  
  19. /* Local Method */
  20. - locatePanel
  21. {
  22.     static int panelNum = 0;
  23.  
  24.     [panel moveTopLeftTo: Panel_X(panelNum): Panel_Y(panelNum)];
  25.     ++panelNum;
  26.     return self;
  27. }
  28.  
  29. /* Local Method */
  30. - jumpTo:(int) pos
  31. {
  32.     [slider setIntValue: pos];
  33.     currentNum = pos;
  34.     [nextFile setStringValue: [dirlist filenameAt: pos]];
  35.     return self;
  36. }
  37.  
  38.  
  39. - init:sender dir:(const char *)dir with:(DirList *)list
  40. {
  41.     int i, m;
  42.  
  43.     [NXApp loadNibSection:"AutoDisplay.nib" owner:self];
  44.     dirlist = list;
  45.     status = Stat_INIT;
  46.     fileNum = [dirlist fileNumber];
  47.     [slider setMaxValue: (fileNum - 1)];
  48.     [sliderMax setIntValue: fileNum];
  49.     [[self locatePanel] jumpTo: 0];
  50.     for (i = m = 0; dir[i]; i++)
  51.         if (dir[i] == '/') m = i + 1;
  52.     [[[panel setTitle: &dir[m]] display] makeKeyAndOrderFront: self];
  53.     [[panel setFloatingPanel:YES] setWorksWhenModal:YES];
  54.     [panel setFreeWhenClosed:YES];
  55.     NXPing();
  56.     slave = [[ADSlave alloc] init:self with:sender dir:dir];
  57.     waiting = NO;
  58.     preference = [sender preference];
  59.     return self;
  60. }
  61.  
  62. - free
  63. {
  64.     [dirlist free];
  65.     [slave free];
  66.     [super free];
  67.     return nil;
  68. }
  69.  
  70.  
  71. /* Local Method */
  72. - setButton:(int)stat
  73. {
  74.     if (activePanel == self && stat != Stat_PLAY)
  75.         activePanel = nil;    /* UNLOCKED */
  76.     [playButton setState:(stat == Stat_PLAY)];
  77.     [pauseButton setState:(stat == Stat_PAUSE)];
  78.     [quitButton setState:(stat == Stat_INIT)];
  79.     [slider setEnabled:(stat != Stat_PLAY)];
  80.     return self;
  81. }
  82.  
  83. - pausePush:sender
  84. {
  85.     [self setButton: (status = Stat_PAUSE)];
  86.     return self;
  87. }
  88.  
  89. - playPush:sender
  90. {
  91.     if (activePanel != nil && activePanel != self) {
  92.         [self setButton: status];
  93.         NXBeep();
  94.         return self;
  95.     }
  96.     activePanel = self;    /* LOCKED */
  97.     [self setButton: Stat_PLAY];
  98.     if (status != Stat_PLAY) {
  99.         status = Stat_PLAY;
  100.         [slave perform:@selector(donext:) with:self
  101.                 afterDelay: 300 cancelPrevious:YES];
  102.         waiting = YES;
  103.     }
  104.     return self;
  105. }
  106.  
  107. - quitPush:sender
  108. {
  109.     [self setButton: Stat_INIT];
  110.     [panel close];
  111.     NXPing();
  112.     if (waiting) {
  113.         status = Stat_QUIT;
  114.         return self;
  115.     }
  116.     return [self free];
  117. }
  118.  
  119.  
  120. - sliderChange:sender
  121. {
  122.     int n = [slider intValue];
  123.     if (currentNum != n)
  124.         [self jumpTo: n];
  125.     return self;
  126. }
  127.  
  128. - sliderDown:sender
  129. {
  130.     if (status != Stat_PLAY && currentNum > 0)
  131.         [self jumpTo: currentNum - 1];
  132.     return self;
  133. }
  134.  
  135. - sliderUp:sender
  136. {
  137.     if (status != Stat_PLAY && currentNum < fileNum-1)
  138.         [self jumpTo: currentNum + 1];
  139.     return self;
  140. }
  141.  
  142.  
  143. - (const char *)nextFilename
  144. {
  145.     return (status == Stat_PLAY) ? [dirlist filenameAt: currentNum] : NULL;
  146. }
  147.  
  148. - continueLoop:(BOOL)cont
  149. {
  150.     int intv;
  151.  
  152.     if (status == Stat_QUIT) return [self free];
  153.     if (!cont) {
  154.         waiting = NO;
  155.         return self;
  156.     }
  157.     if (currentNum >= fileNum-1) {
  158.         [self pausePush: self];
  159.         waiting = NO;
  160.         return self;
  161.     }
  162.     [self jumpTo: currentNum + 1];
  163.     intv = (preference) ? [preference autoDisplayInterval] : 2500;
  164.     [slave perform:@selector(donext:) with:self
  165.             afterDelay: intv cancelPrevious:YES];
  166.     waiting = YES;
  167.     return self;
  168. }
  169.  
  170. @end
  171.